package com.cos.shop.services.impl;

import com.cos.shop.common.Const;
import com.cos.shop.common.ResponseCode;
import com.cos.shop.common.ResponseResult;
import com.cos.shop.dao.UserDao;
import com.cos.shop.dao.impl.UserDaoImpl;
import com.cos.shop.entity.User;
import com.cos.shop.services.UserServices;
import com.cos.shop.util.*;

import java.sql.SQLException;

/**
 * @author: COS
 * @time: 2023/5/9 15:34
 * @description:
 */
public class UserServicesImpl implements UserServices {
    private UserDao ud = new UserDaoImpl();

    @Override
    public ResponseResult doLogin(String username, String password) {
        try {
            if (StringUtils.isNotEmpty(username,password)) {
               User user =  ud.getUserByUsername(username);
               // 数据库获取的密码是被加密过的密码
                // 把用户输入的密码先进行加密MD5,在进行比较
                String md5=MD5Utils.md5(password);
                if (user!=null&&user.getUpassword().equals(md5)) {
                    // 判断用户是否激活
                    if (user.getUstatus()== Const.UserRole.ACTIVE) {
                        // 登录成功
                        return ResponseResult.createSuccess(user);
                    }else{
                        // 请先激活
                        return ResponseResult.createFail("账户未激活,请先激活");
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ResponseResult.createFail("用户或密码有误,请重新再试");
    }

    @Override
    public ResponseResult sendMessage(String phone) {
        // 假业务
        if (StringUtils.isNotEmpty(phone)) {
            // 发送这个手机号去查询有没有这个数据
            // 判断是否是否存在
            // 如果存在就发送短信
            String send = SendMessage.send(phone);
            return ResponseResult.createSuccess(send);
        }
        return ResponseResult.createFail();
    }

    @Override
    public ResponseResult activate(String e, String c) {
        try {
            //1 判断是否为Null
            if (!StringUtils.isNotEmpty(e,c)) {
                // 有null
                return ResponseResult.createFail("激活失败,邮箱或激活码有误,请重新再试或联系管理员");
            }
            //2 解码
            String email = Base64Utils.decode(e);
            String code = Base64Utils.decode(c);
            //3 判断有没有这个对应的数据 查询数据 email + code 查询
            User user = ud.getUserByEmailAndCode(email,code);
            //4 判断数据是否为null
            if (user==null) {
                return ResponseResult.createFail("没有此账户,无法激活");
            }
            //5 判断用户是否已激活
            if (user.getUstatus()== Const.UserRole.ACTIVE) {
                //用户已经有激活了
                return ResponseResult.createFail("账户已激活,无需重复操作,请直接登录");
            }
            //6 进行激活
            if (ud.activate(user.getUid())>0) {
                return ResponseResult.createSuccess("激活成功,请进入首页登录");
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return ResponseResult.createFail("激活失败,请不要再试");
    }

    @Override
    public ResponseResult reg(User u) {
        try {
            //判断对象是否为null
            if (u != null) {
                // 设置新增用户的一些数据
                // 设置用户权限为普通用户
                u.setUrole(Const.UserRole.USER);
                // 设置刚注册用户为激活状态
                u.setUstatus(Const.UserRole.NOT_ACTIVE);
                // 设置邮件激活码
                u.setUcode(RandomUtils.createActive());
                // 把用户密码加密
                u.setUpassword(MD5Utils.md5(u.getUpassword()));
                // 发送dao 操作新增
                if (ud.insertUser(u)>0) {
                    // 注册成功后再发送邮件 , 为防止邮件发送过慢导致用户体验不好,设置线程发送邮件
                    new Thread(()-> EmailUtils.sendEmail(u)).start();
                    /*new Thread(new Runnable() {
                        @Override
                        public void run() {
                            EmailUtils.sendEmail(u);
                        }
                    }).start();*/
                    return ResponseResult.createSuccess("注册成功");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ResponseResult.createFail("注册失败,请稍后再试~ 哎嘿~");
    }

    @Override
    public ResponseResult findUserByNameByNewResult(String username) {
        try {
            if (StringUtils.isNotEmpty(username)) {
                //访问dao 查询数据
                User user = ud.findUserByName(username);
                //判断是否获取到数据
                if (user != null) {
                    //查询到数据了,.给controller一个成功的响应信息
                    return ResponseResult.createSuccess("用户名不可用");
                }
            }else{
                // 示例各种使用方式
                return ResponseResult.createResult(ResponseCode.SUCCESS.getCode(),"用户名不能为空",null);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ResponseResult.createFail("用户名可用 哎嘿嘿");
    }

    @Override
    public User findUserByName(String username) {
        try {
            if (StringUtils.isNotEmpty(username)) {
                //访问dao 查询数据
                return ud.findUserByName(username);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}
